using System;
using System.Linq;
using System.Windows.Forms;
using App.Controlador;
using App.Modelo;

namespace App.Seguridad.Vista.Forms
{
    public partial class DetalleUsuario : Form
    {
        private ControladoraGrupos _controladoraGrupos;
        private ControladoraUsuarios _controladoraUsuarios;
        private ModoFormularioABM _modo = ModoFormularioABM.Ver;

        private Usuario _usuario;

        public DetalleUsuario()
        {
            InitializeComponent();

            grupoBindingSource.DataSource = ControladoraGrupos.List();
            checkedListBox1.DataSource = ControladoraGrupos.List();
        }

        public ModoFormularioABM Modo
        {
            get { return _modo; }
            set
            {
                _modo = value;
                switch (value)
                {
                    case ModoFormularioABM.Alta:
                    case ModoFormularioABM.Baja:
                    case ModoFormularioABM.Modificacion:
                        toolStrip1.Visible
                              = groupBox2.Enabled
                                = groupBox3.Enabled
                                  = true;
                        break;
                    case ModoFormularioABM.Ver:
                        toolStrip1.Visible
                              = groupBox2.Enabled
                                = groupBox3.Enabled
                                  = false;
                        break;
                }
            }
        }

        public ControladoraUsuarios ControladoraUsuarios
        {
            get
            {
                return _controladoraUsuarios ??
                       (_controladoraUsuarios =
                        ModuloSeguridad.Instance.FabricaControladoras.Factory<ControladoraUsuarios>());
            }
            set { _controladoraUsuarios = value; }
        }

        public Usuario Usuario
        {
            get { return _usuario; }
            set
            {
                _usuario = value;
                usuarioBindingSource.DataSource = value;

                if (_usuario != null)
                    foreach (Grupo g in _usuario.Grupos)
                        checkedListBox1.SetItemChecked(checkedListBox1.Items.IndexOf(g), true);
            }
        }

        public ControladoraGrupos ControladoraGrupos
        {
            set { _controladoraGrupos = value; }
            get
            {
                return _controladoraGrupos ??
                       (_controladoraGrupos =
                        ModuloSeguridad.Instance.FabricaControladoras.Factory<ControladoraGrupos>());
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            Validate();
            try
            {
                switch (Modo)
                {
                    case ModoFormularioABM.Alta:
                        ControladoraUsuarios.Alta(Usuario);
                        DialogResult = DialogResult.OK;
                        Close();
                        break;
                    case ModoFormularioABM.Modificacion:
                        ControladoraUsuarios.Update(Usuario);
                        DialogResult = DialogResult.OK;
                        Close();
                        break;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(
                    ex.Message,
                    "Error al guardar el usuario",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation
                    );
            }
        }


        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            usuarioBindingSource.ResetItem(0);
            DialogResult = DialogResult.Cancel;
            Close();
        }


        private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            var nuevoGrupo = (Grupo) checkedListBox1.Items[e.Index];
            bool tieneGrupo = Usuario.Grupos.Any(gr => gr.Equals(nuevoGrupo));

            if (e.NewValue == CheckState.Checked)
            {
                if (!tieneGrupo)
                {
                    Usuario.Grupos.Add(nuevoGrupo);
                }
            }
            else if (e.NewValue == CheckState.Unchecked)
            {
                if (tieneGrupo)
                {
                    Usuario.Grupos.Remove(nuevoGrupo);
                }
            }
        }

    }
}